﻿package org.utils 
{
	import flash.display.*;
	import flash.geom.Point;
	import flash.utils.Timer;
	import flash.events.*
	/**
	 * 缓动类，支持定点放大和线性缓入 
	 * @author Administrator
	 * 
	 */    
	public class Motion
	{
		
		public function Motion() 
		{
			
		}
		
		/**
		 * 定点放大 
		 * @param obj 要控制的对象
		 * @param b 对象要改变的缩放属性初始值
		 * @param c 相对缩放属性初始值的改变量
		 * @param fun 缩放结束临界要执行的方法
		 * @return 
		 * 
		 */		
		public static function scalePosition(obj:MovieClip,b:Number,c:Number,fun:Function=null):void {
			
			var t:Number=1
			var d:Number = 10 * Math.abs(c)
			d = Math.max(1, d)
			var timer:Timer = new Timer(50)
			
			if (obj["scale"] != null) { obj["scale"].stop(); }
			
			obj["scale"]=timer
			timer.start()
		    timer.addEventListener(TimerEvent.TIMER, timerEvent)

			var objPoint:Point=new Point(0,0)
			var rootPoint:Point=obj.localToGlobal(objPoint)
			
		    function timerEvent(e:TimerEvent) {
				var result:Number=easeOutQuad(t, b, c, d)
			    obj["scaleX"] = result
				obj["scaleY"] = result
				var rootPoint_new:Point = obj.localToGlobal(objPoint)
				obj.x += rootPoint.x-rootPoint_new.x
				obj.y += rootPoint.y-rootPoint_new.y
			    t++
			    if (t >= d) {
					obj["scaleX"] = b+c
				    obj["scaleY"] = b+c
					obj["scale"] = null
					if(fun!=null)fun()
				    timer.removeEventListener(TimerEvent.TIMER, timerEvent)
				}
				
			}
		}

		/**
		 * 线性缓入运动 
		 * @param obj 要控制的对象
		 * @param objPropertyname 要控制的对象属性的字符串表现形式
		 * @param b 属性初始值
		 * @param c 相对属性初始值的改变量
		 * @return 
		 * 
		 */		
	    public static function moveLinear(obj:MovieClip,objPropertyname:String,b:Number,c:Number):void {

			var t:Number=1
			var d:Number = 10
			d = Math.max(1, d)
			
			var timer:Timer = new Timer(50)
			if (obj[objPropertyname+"_property"] != null) { obj[objPropertyname+"_property"].stop() }
			obj[objPropertyname+"_property"]=timer
			timer.start()
		    timer.addEventListener(TimerEvent.TIMER, timerEvent)
			
		    function timerEvent(e:TimerEvent) {
			    obj[objPropertyname]=easeOutQuad(t, b, c, d)
			    t++
			    if (t > d) {
					obj[objPropertyname]=b+c
					obj[objPropertyname+"_property"]=null
				    timer.removeEventListener(TimerEvent.TIMER, timerEvent)
				}
			}
			
		}
		/**
		 * 线性缓动 
		 * @param t 运动初始时间，默认为零
		 * @param b 初始值
		 * @param c 相对初始值的改变量
		 * @param d 运动总时长
		 * @return  Number
		 * 
		 */        
		public static function easeOutQuad(t:Number, b:Number, c:Number, d:Number):Number {
	          var ts:Number=(t/=d)*t;
	          var tc:Number=ts*t;
	          return b+c*(1.65000000000001*tc*ts + -6.39750000000001*ts*ts + 10.195*tc + -8.795*ts + 4.3475*t);
            }
		
	}

}